From: David Härdeman Date: Mon, 10 Nov 2025 22:03:25 +0000 (+0100) Subject: odhcpd: rename [lease_cfg|dhcpv4_lease]->ipaddr to ipv4 X-Git-Url: http://git.openwrt.org/%22https:/collectd.org//%22/%22https:/collectd.org/%22?a=commitdiff_plain;h=f872ae543e6d974d1bafda35a54204b2646b5fa9;p=project%2Fodhcpd.git odhcpd: rename [lease_cfg|dhcpv4_lease]->ipaddr to ipv4 "ipaddr" doesn't say if it's IPv4 or IPv6, and we want to be clear in a dual-stack codebase. And at the same time, use a struct in_addr to store the IPv4 address, which is just less confusing. Finally, remove all uses of "inet_ntoa()", which is deprecated. Signed-off-by: David Härdeman Link: https://github.com/openwrt/odhcpd/pull/306 Signed-off-by: Álvaro Fernández Rojas --- diff --git a/src/config.c b/src/config.c index 056dd47..598b1e8 100644 --- a/src/config.c +++ b/src/config.c @@ -195,7 +195,7 @@ const struct uci_blob_param_list interface_attr_list = { }; const struct blobmsg_policy lease_cfg_attrs[LEASE_CFG_ATTR_MAX] = { - [LEASE_CFG_ATTR_IP] = { .name = "ip", .type = BLOBMSG_TYPE_STRING }, + [LEASE_CFG_ATTR_IPV4] = { .name = "ip", .type = BLOBMSG_TYPE_STRING }, [LEASE_CFG_ATTR_MAC] = { .name = "mac", .type = BLOBMSG_TYPE_ARRAY }, [LEASE_CFG_ATTR_DUID] = { .name = "duid", .type = BLOBMSG_TYPE_ARRAY }, [LEASE_CFG_ATTR_HOSTID] = { .name = "hostid", .type = BLOBMSG_TYPE_STRING }, @@ -670,12 +670,12 @@ int config_set_lease_cfg_from_blobmsg(struct blob_attr *ba) goto err; } - if ((c = tb[LEASE_CFG_ATTR_IP])) { + if ((c = tb[LEASE_CFG_ATTR_IPV4])) { const char *ip = blobmsg_get_string(c); if (!strcmp(ip, "ignore")) lease_cfg->ignore4 = true; - else if (inet_pton(AF_INET, blobmsg_get_string(c), &lease_cfg->ipaddr) < 0) + else if (inet_pton(AF_INET, blobmsg_get_string(c), &lease_cfg->ipv4) != 1) goto err; } @@ -691,7 +691,7 @@ int config_set_lease_cfg_from_blobmsg(struct blob_attr *ba) goto err; } } else { - uint32_t i4a = ntohl(lease_cfg->ipaddr) & 0xff; + uint32_t i4a = ntohl(lease_cfg->ipv4.s_addr) & 0xff; lease_cfg->hostid = ((i4a / 100) << 8) | (((i4a % 100) / 10) << 4) | (i4a % 10); } @@ -1791,8 +1791,8 @@ static void lease_cfg_change(struct lease_cfg *lease_cfg_old, struct lease_cfg * update = true; } - if (lease_cfg_old->ipaddr != lease_cfg_new->ipaddr) { - lease_cfg_old->ipaddr = lease_cfg_new->ipaddr; + if (lease_cfg_old->ipv4.s_addr != lease_cfg_new->ipv4.s_addr) { + lease_cfg_old->ipv4 = lease_cfg_new->ipv4; dhcpv4_free_lease(lease_cfg_old->dhcpv4_lease); } @@ -1884,12 +1884,12 @@ struct lease_cfg *config_find_lease_cfg_by_hostid(const uint64_t hostid) return NULL; } -struct lease_cfg *config_find_lease_cfg_by_ipaddr(const uint32_t ipaddr) +struct lease_cfg *config_find_lease_cfg_by_ipv4(const struct in_addr ipv4) { struct lease_cfg *lease_cfg; vlist_for_each_element(&lease_cfgs, lease_cfg, node) { - if (lease_cfg->ipaddr == ipaddr) + if (lease_cfg->ipv4.s_addr == ipv4.s_addr) return lease_cfg; } diff --git a/src/dhcpv4.c b/src/dhcpv4.c index f5db428..5aa2309 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -87,7 +87,7 @@ static bool leases_require_fr(struct interface *iface, struct odhcpd_ipaddr *add avl_for_each_element(&iface->dhcpv4_leases, lease, iface_avl) { if ((lease->accept_fr_nonce || iface->dhcpv4_forcereconf) && !lease->fr_ip && - ((lease->addr & mask) == (addr->addr.in.s_addr & mask))) { + ((lease->ipv4.s_addr & mask) == (addr->addr.in.s_addr & mask))) { if (!fr_ip) { fr_ip = calloc(1, sizeof(*fr_ip)); if (!fr_ip) @@ -231,7 +231,7 @@ static void dhcpv4_fr_send(struct dhcpv4_lease *lease) struct sockaddr_in dest = { .sin_family = AF_INET, .sin_port = htons(DHCPV4_CLIENT_PORT), - .sin_addr = { lease->addr }, + .sin_addr = lease->ipv4, }; odhcpd_urandom(&fr.xid, sizeof(fr.xid)); @@ -272,12 +272,19 @@ static void dhcpv4_fr_send(struct dhcpv4_lease *lease) } if (dhcpv4_send_reply(iov, ARRAY_SIZE(iov), (struct sockaddr *)&dest, sizeof(dest), - &lease->iface->dhcpv4_event.uloop.fd) < 0) + &lease->iface->dhcpv4_event.uloop.fd) < 0) { + char ipv4_str[INET_ADDRSTRLEN]; + error("Failed to send %s to %s - %s: %m", dhcpv4_msg_to_string(fr_msg.data), - odhcpd_print_mac(lease->hwaddr, sizeof(lease->hwaddr)), inet_ntoa(dest.sin_addr)); - else + odhcpd_print_mac(lease->hwaddr, sizeof(lease->hwaddr)), + inet_ntop(AF_INET, &dest, ipv4_str, sizeof(ipv4_str))); + } else { + char ipv4_str[INET_ADDRSTRLEN]; + debug("Sent %s to %s - %s", dhcpv4_msg_to_string(fr_msg.data), - odhcpd_print_mac(lease->hwaddr, sizeof(lease->hwaddr)), inet_ntoa(dest.sin_addr)); + odhcpd_print_mac(lease->hwaddr, sizeof(lease->hwaddr)), + inet_ntop(AF_INET, &dest, ipv4_str, sizeof(ipv4_str))); + } } static void dhcpv4_fr_stop(struct dhcpv4_lease *lease) @@ -365,7 +372,7 @@ dhcpv4_alloc_lease(struct interface *iface, const uint8_t *hwaddr, if (!lease) return NULL; - lease->iface_avl.key = &lease->addr; + lease->iface_avl.key = &lease->ipv4; lease->hwaddr_len = hwaddr_len; memcpy(lease->hwaddr, hwaddr, hwaddr_len); if (duid_len > 0) { @@ -379,9 +386,9 @@ dhcpv4_alloc_lease(struct interface *iface, const uint8_t *hwaddr, } static bool dhcpv4_insert_lease(struct avl_tree *avl, struct dhcpv4_lease *lease, - uint32_t addr) + struct in_addr addr) { - lease->addr = addr; + lease->ipv4 = addr; if (!avl_insert(avl, &lease->iface_avl)) return true; else @@ -389,7 +396,7 @@ static bool dhcpv4_insert_lease(struct avl_tree *avl, struct dhcpv4_lease *lease } static bool dhcpv4_assign(struct interface *iface, struct dhcpv4_lease *lease, - uint32_t raddr) + struct in_addr req_addr) { uint32_t start = ntohl(iface->dhcpv4_start_ip.s_addr); uint32_t end = ntohl(iface->dhcpv4_end_ip.s_addr); @@ -398,33 +405,33 @@ static bool dhcpv4_assign(struct interface *iface, struct dhcpv4_lease *lease, char ipv4_str[INET_ADDRSTRLEN]; /* Preconfigured IP address by static lease */ - if (lease->addr) { - if (!dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, lease->addr)) { + if (lease->ipv4.s_addr) { + if (!dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, lease->ipv4)) { error("The static IP address is already assigned: %s", - inet_ntop(AF_INET, &lease->addr, ipv4_str, sizeof(ipv4_str))); + inet_ntop(AF_INET, &lease->ipv4, ipv4_str, sizeof(ipv4_str))); return false; } debug("Assigned static IP address: %s", - inet_ntop(AF_INET, &lease->addr, ipv4_str, sizeof(ipv4_str))); + inet_ntop(AF_INET, &lease->ipv4, ipv4_str, sizeof(ipv4_str))); iface->update_statefile = true; return true; } /* The client asked for a specific address, let's try... */ - if (ntohl(raddr) < start || ntohl(raddr) > end) { + if (ntohl(req_addr.s_addr) < start || ntohl(req_addr.s_addr) > end) { debug("The requested IP address is outside the pool: %s", - inet_ntop(AF_INET, &raddr, ipv4_str, sizeof(ipv4_str))); - } else if (config_find_lease_cfg_by_ipaddr(raddr)) { + inet_ntop(AF_INET, &req_addr, ipv4_str, sizeof(ipv4_str))); + } else if (config_find_lease_cfg_by_ipv4(req_addr)) { debug("The requested IP address is statically assigned: %s", - inet_ntop(AF_INET, &raddr, ipv4_str, sizeof(ipv4_str))); - } else if (!dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, raddr)) { + inet_ntop(AF_INET, &req_addr, ipv4_str, sizeof(ipv4_str))); + } else if (!dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, req_addr)) { debug("The requested IP address is already assigned: %s", - inet_ntop(AF_INET, &raddr, ipv4_str, sizeof(ipv4_str))); + inet_ntop(AF_INET, &req_addr, ipv4_str, sizeof(ipv4_str))); } else { debug("Assigned the requested IP address: %s", - inet_ntop(AF_INET, &lease->addr, ipv4_str, sizeof(ipv4_str))); + inet_ntop(AF_INET, &lease->ipv4, ipv4_str, sizeof(ipv4_str))); iface->update_statefile = true; return true; } @@ -442,14 +449,14 @@ static bool dhcpv4_assign(struct interface *iface, struct dhcpv4_lease *lease, /* ...and try a bunch of times to assign a randomly chosen address */ for (uint32_t i = 0, try = (((uint32_t)rand()) % count) + start; i < count; ++i, try = (((try - start) + 1) % count) + start) { - uint32_t n_try = htonl(try); + struct in_addr n_try = { .s_addr = htonl(try) }; - if (config_find_lease_cfg_by_ipaddr(n_try)) + if (config_find_lease_cfg_by_ipv4(n_try)) continue; if (dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, n_try)) { debug("Assigned IP adress from pool: %s (succeeded on attempt %u of %u)", - inet_ntop(AF_INET, &lease->addr, ipv4_str, sizeof(ipv4_str)), + inet_ntop(AF_INET, &lease->ipv4, ipv4_str, sizeof(ipv4_str)), i + 1, count); iface->update_statefile = true; @@ -467,7 +474,7 @@ static struct dhcpv4_lease *find_lease_by_hwaddr(struct interface *iface, const struct dhcpv4_lease *lease; avl_for_each_element(&iface->dhcpv4_leases, lease, iface_avl) - if (!memcmp(lease->hwaddr, hwaddr, 6)) + if (!memcmp(lease->hwaddr, hwaddr, ETH_ALEN)) return lease; return NULL; @@ -491,7 +498,7 @@ find_lease_by_duid_iaid(struct interface *iface, const uint8_t *duid, static struct dhcpv4_lease * dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *req_mac, - const uint8_t *clid, size_t clid_len, const uint32_t req_addr, + const uint8_t *clid, size_t clid_len, const struct in_addr req_addr, uint32_t *req_leasetime, const char *req_hostname, const size_t req_hostname_len, const bool req_accept_fr, bool *reply_incl_fr, uint32_t *fr_serverid) @@ -551,11 +558,10 @@ dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *re if (!lease) return NULL; - ubus_bcast_dhcp_event("dhcp.release", req_mac, - (struct in_addr *)&lease->addr, + ubus_bcast_dhcp_event("dhcp.release", req_mac, lease->ipv4, lease->hostname, iface->ifname); - dhcpv4_free_lease(lease); - lease = NULL; + dhcpv4_free_lease(lease); + lease = NULL; break; case DHCPV4_MSG_DECLINE: @@ -564,7 +570,7 @@ dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *re lease->flags &= ~OAF_BOUND; - if (!(lease->flags & OAF_STATIC) || lease->lease_cfg->ipaddr != lease->addr) { + if (!(lease->flags & OAF_STATIC) || lease->lease_cfg->ipv4.s_addr != lease->ipv4.s_addr) { memset(lease->hwaddr, 0, sizeof(lease->hwaddr)); lease->valid_until = now + 3600; /* Block address for 1h */ } else { @@ -580,12 +586,12 @@ dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *re return NULL; /* Old lease, but with an address that is out-of-scope? */ - if (lease && ((lease->addr & iface->dhcpv4_mask.s_addr) != + if (lease && ((lease->ipv4.s_addr & iface->dhcpv4_mask.s_addr) != (iface->dhcpv4_start_ip.s_addr & iface->dhcpv4_mask.s_addr)) && !(lease->flags & OAF_STATIC)) { /* Try to reassign to an address that is in-scope */ avl_delete(&iface->dhcpv4_leases, &lease->iface_avl); - lease->addr = INADDR_ANY; + lease->ipv4.s_addr = INADDR_ANY; if (!dhcpv4_assign(iface, lease, req_addr)) { dhcpv4_free_lease(lease); lease = NULL; @@ -603,7 +609,7 @@ dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *re /* static lease => infinite (0), else a placeholder */ lease->valid_until = lease_cfg ? 0 : now; - lease->addr = lease_cfg ? lease_cfg->ipaddr : INADDR_ANY; + lease->ipv4.s_addr = lease_cfg ? lease_cfg->ipv4.s_addr : INADDR_ANY; if (!dhcpv4_assign(iface, lease, req_addr)) { dhcpv4_free_lease(lease); @@ -779,7 +785,7 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, uint8_t req_msg = DHCPV4_MSG_REQUEST; uint8_t *req_opts = NULL; size_t req_opts_len = 0; - uint32_t req_addr = INADDR_ANY; + struct in_addr req_addr = { .s_addr = INADDR_ANY }; uint32_t req_leasetime = 0; char *req_hostname = NULL; size_t req_hostname_len = 0; @@ -1041,8 +1047,8 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, break; } - if ((req_addr && req_addr != lease->addr) || - (req->ciaddr.s_addr && req->ciaddr.s_addr != lease->addr)) { + if ((req_addr.s_addr && req_addr.s_addr != lease->ipv4.s_addr) || + (req->ciaddr.s_addr && req->ciaddr.s_addr != lease->ipv4.s_addr)) { reply_msg.data = DHCPV4_MSG_NAK; /* * DHCP client requested an IP which we can't offer to him. Probably the @@ -1288,28 +1294,32 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, } if (lease) - reply.yiaddr.s_addr = lease->addr; + reply.yiaddr = lease->ipv4; memcpy(reply.chaddr, req->chaddr, sizeof(reply.chaddr)); dhcpv4_set_dest_addr(iface, reply_msg.data, req, &reply, src_addr, &dest_addr); dhcpv4_add_padding(iov, ARRAY_SIZE(iov)); - if (send_reply(iov, ARRAY_SIZE(iov), (struct sockaddr *)&dest_addr, sizeof(dest_addr), opaque) < 0) + if (send_reply(iov, ARRAY_SIZE(iov), (struct sockaddr *)&dest_addr, sizeof(dest_addr), opaque) < 0) { + char ipv4_str[INET_ADDRSTRLEN]; + error("Failed to send %s to %s - %s: %m", dhcpv4_msg_to_string(reply_msg.data), dest_addr.sin_addr.s_addr == INADDR_BROADCAST ? "ff:ff:ff:ff:ff:ff": odhcpd_print_mac(req->chaddr, req->hlen), - inet_ntoa(dest_addr.sin_addr)); - else + inet_ntop(AF_INET, &dest_addr.sin_addr, ipv4_str, sizeof(ipv4_str))); + } else { + char ipv4_str[INET_ADDRSTRLEN]; + error("Sent %s to %s - %s", dhcpv4_msg_to_string(reply_msg.data), dest_addr.sin_addr.s_addr == INADDR_BROADCAST ? "ff:ff:ff:ff:ff:ff": odhcpd_print_mac(req->chaddr, req->hlen), - inet_ntoa(dest_addr.sin_addr)); + inet_ntop(AF_INET, &dest_addr.sin_addr, ipv4_str, sizeof(ipv4_str))); + } if (reply_msg.data == DHCPV4_MSG_ACK && lease) - ubus_bcast_dhcp_event("dhcp.ack", req->chaddr, - (struct in_addr *)&lease->addr, + ubus_bcast_dhcp_event("dhcp.ack", req->chaddr, lease->ipv4, lease->hostname, iface->ifname); } @@ -1575,8 +1585,7 @@ static void dhcpv4_valid_until_cb(struct uloop_timeout *event) avl_for_each_element_safe(&iface->dhcpv4_leases, lease, iface_avl, tmp) { if (!INFINITE_VALID(lease->valid_until) && lease->valid_until < now) { - ubus_bcast_dhcp_event("dhcp.expire", lease->hwaddr, - (struct in_addr *)&lease->addr, + ubus_bcast_dhcp_event("dhcp.expire", lease->hwaddr, lease->ipv4, lease->hostname, iface->ifname); dhcpv4_free_lease(lease); update_statefile = true; diff --git a/src/odhcpd.h b/src/odhcpd.h index 924fbe2..fbbba1a 100644 --- a/src/odhcpd.h +++ b/src/odhcpd.h @@ -237,12 +237,12 @@ struct dhcpv4_lease { struct interface *iface; // assignment interface, non-null struct lease_cfg *lease_cfg; // host lease cfg, nullable - uint32_t addr; // client IP address + struct in_addr ipv4; // client IPv4 address unsigned int flags; // OAF_* time_t valid_until; // CLOCK_MONOTONIC time, 0 = inf char *hostname; // client hostname size_t hwaddr_len; // hwaddr length - uint8_t hwaddr[6]; // hwaddr (only MAC supported) + uint8_t hwaddr[ETH_ALEN]; // hwaddr (only MAC supported) // ForceRenew Nonce - RFC6704 §3.1.2 struct uloop_timeout fr_timer; // FR message transmission timer @@ -294,7 +294,7 @@ struct lease_cfg { struct vlist_node node; struct list_head dhcpv6_leases; struct dhcpv4_lease *dhcpv4_lease; - uint32_t ipaddr; + struct in_addr ipv4; uint64_t hostid; size_t mac_count; struct ether_addr *macs; @@ -475,7 +475,7 @@ struct interface { extern struct avl_tree interfaces; enum { - LEASE_CFG_ATTR_IP, + LEASE_CFG_ATTR_IPV4, LEASE_CFG_ATTR_MAC, LEASE_CFG_ATTR_DUID, LEASE_CFG_ATTR_HOSTID, @@ -553,7 +553,7 @@ struct lease_cfg *config_find_lease_cfg_by_duid_and_iaid(const uint8_t *duid, const uint32_t iaid); struct lease_cfg *config_find_lease_cfg_by_mac(const uint8_t *mac); struct lease_cfg *config_find_lease_cfg_by_hostid(const uint64_t hostid); -struct lease_cfg *config_find_lease_cfg_by_ipaddr(const uint32_t ipaddr); +struct lease_cfg *config_find_lease_cfg_by_ipv4(const struct in_addr ipv4); int config_set_lease_cfg_from_blobmsg(struct blob_attr *ba); void config_load_ra_pio(struct interface *iface); void config_save_ra_pio(struct interface *iface); @@ -564,7 +564,7 @@ const char* ubus_get_ifname(const char *name); void ubus_apply_network(void); bool ubus_has_prefix(const char *name, const char *ifname); void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac, - const struct in_addr *addr, const char *name, + const struct in_addr ipv4, const char *name, const char *interface); #else static inline int ubus_init(void) @@ -579,7 +579,7 @@ static inline void ubus_apply_network(void) static inline void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac, - const struct in_addr *addr, const char *name, + const struct in_addr ipv4, const char *name, const char *interface) { return; diff --git a/src/statefiles.c b/src/statefiles.c index e27a92c..4258cbf 100644 --- a/src/statefiles.c +++ b/src/statefiles.c @@ -79,13 +79,12 @@ static void statefiles_write_host6_cb(struct dhcpv6_lease *lease, struct in6_add static bool statefiles_write_host4(struct write_ctxt *ctxt, struct dhcpv4_lease *lease) { char ipbuf[INET_ADDRSTRLEN]; - struct in_addr addr = { .s_addr = lease->addr }; if (!lease->hostname || lease->flags & OAF_BROKEN_HOSTNAME) return false; if (ctxt->fp) { - inet_ntop(AF_INET, &addr, ipbuf, sizeof(ipbuf)); + inet_ntop(AF_INET, &lease->ipv4, ipbuf, sizeof(ipbuf)); statefiles_write_host(ipbuf, lease->hostname, ctxt); } @@ -214,10 +213,9 @@ static void statefiles_write_state6(struct write_ctxt *ctxt, struct dhcpv6_lease static void statefiles_write_state4(struct write_ctxt *ctxt, struct dhcpv4_lease *lease) { char hexhwaddr[sizeof(lease->hwaddr) * 2 + 1]; - struct in_addr addr = { .s_addr = lease->addr }; char ipbuf[INET6_ADDRSTRLEN]; - inet_ntop(AF_INET, &addr, ipbuf, sizeof(ipbuf)); + inet_ntop(AF_INET, &lease->ipv4, ipbuf, sizeof(ipbuf)); if (statefiles_write_host4(ctxt, lease)) { md5_hash(ipbuf, strlen(ipbuf), &ctxt->md5); @@ -238,7 +236,7 @@ static void statefiles_write_state4(struct write_ctxt *ctxt, struct dhcpv4_lease (lease->valid_until > ctxt->now ? (int64_t)(lease->valid_until - ctxt->now + ctxt->wall_time) : (INFINITE_VALID(lease->valid_until) ? -1 : 0)), - ntohl(lease->addr), ipbuf); + ntohl(lease->ipv4.s_addr), ipbuf); } /* Returns true if there are changes to be written to the hosts file(s) */ diff --git a/src/ubus.c b/src/ubus.c index 1301291..51c4708 100644 --- a/src/ubus.c +++ b/src/ubus.c @@ -63,8 +63,7 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob blobmsg_close_array(&b, m); buf = blobmsg_alloc_string_buffer(&b, "address", INET_ADDRSTRLEN); - struct in_addr addr = {.s_addr = c->addr}; - inet_ntop(AF_INET, &addr, buf, INET_ADDRSTRLEN); + inet_ntop(AF_INET, &c->ipv4, buf, INET_ADDRSTRLEN); blobmsg_add_string_buffer(&b); blobmsg_add_u32(&b, "valid", INFINITE_VALID(c->valid_until) ? @@ -394,17 +393,18 @@ static const struct blobmsg_policy obj_attrs[OBJ_ATTR_MAX] = { }; void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac, - const struct in_addr *addr, const char *name, + const struct in_addr ipv4, const char *name, const char *interface) { + char ipv4_str[INET_ADDRSTRLEN]; + if (!ubus || !main_object.has_subscribers) return; blob_buf_init(&b, 0); if (mac) blobmsg_add_string(&b, "mac", odhcpd_print_mac(mac, ETH_ALEN)); - if (addr) - blobmsg_add_string(&b, "ip", inet_ntoa(*addr)); + blobmsg_add_string(&b, "ip", inet_ntop(AF_INET, &ipv4, ipv4_str, sizeof(ipv4_str))); if (name) blobmsg_add_string(&b, "name", name); if (interface)